<?php
/**
 * Hook 基于事件驱动的钩子类
 *
 * @author Mo yi <root@imoi.cn>
 * @link   http://www.imoi.cn
 * @copyright Copyright &copy; 2010-2012 DuoLam Software LLC
 * @license http://www.imoi.cn/license/
 * @version $Id: dpHook.php 2 2012-04-04 13:35:54Z Mo.yi $
 * @package web.helper
 * @since 1.0
 */

class dpHook
{
	/**
	 * 事件列表
	 */
	private $_events = array();

	/**
	 * 获取事件下的所有钩子，如果参数为空，则返回所有事件，包括事件的钩子
	 * @param string $eventName 事件名
	 * @return array 事件列表或某个事件的钩子列表
	 */
	public function getEvent($eventName = '')
	{
		if (empty($eventName))
			return $this->_events;
		else if (isset($this->_events[$eventName]))
			return $this->_events[$eventName];
		else
			return false;
	}

	/**
	 * 注册一个事件
	 * @param string 事件名
	 * @return boolean || object 成功返回类本身
	 */
	public function registerEvent($event)
	{
		if (!isset($this->_events[$event])) {
			$this->_events[$event] = array();
			return $this;
		} else {
			return false;
		}
	}

	/**
	 * 注册一个钩子
	 * @param string $eventName 事件名
	 * @param string $className 钩子名
	 * @return boolean || object 成功返回类本身
	 */
	public function registerHook($eventName, $className)
	{
		if (isset($this->_events[$eventName]) && !isset($this->_events[$eventName][$className])) {
			$this->_events[$eventName][$className] = true;
			return $this;
		} else {
			return false;
		}
	}

	/**
	 * 执行某个事件的某一个钩子
	 * @param string $eventName 事件名
	 * @param string $className 钩子名
	 */
	public function callHookOne($eventName, $className)
	{
		if (isset($this->_events[$eventName][$className])) {
			$class = new $className;
			$class->run();
			$class = null;
			unset($class);
		}
	}

	
	/**
	 * 执行某个事件的所有钩子
	 * @param string $eventName 事件名
	 */
	public function callHook($eventName)
	{
		if (isset($this->_events[$eventName])) {
			foreach ($this->_events[$eventName] as $className) {
				$class = new $className;
				$class->run();
			}
			$class = null;
			unset($class);
		}
	}

	/**
	 * 注销一个事件
	 * @param string $eventName 事件名
	 * @return boolean || object 成功返回类本身
	 */
	public function unEvent($eventName)
	{
		if (isset($this->_events[$eventName])) {
			unset($this->_events[$eventName]);
			return $this;
		} else {
			return false;
		}
	}

	/**
	 * 注销某个事件里的插件
	 * @param string $eventName 事件名
	 * @param string $className 钩子名
	 * @return boolean || object 成功返回类本身
	 */
	public function unHook($eventName, $className)
	{
		if (isset($this->_events[$eventName][$className])) {
			unset($this->_events[$eventName[$className]]);
			return $this;
		} else {
			return false;
		}
	}

}